/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2010 huliqing, huliqing.cn@gmail.com
 *
 * This file is part of QFaces.
 * QFaces is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * QFaces is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with QFaces.  If not, see <http://www.gnu.org/licenses/>.
 *
 * 这个文件是QFaces的一部分。
 * 您可以单独使用或分发这个文件，但请不要移除这个头部声明信息.
 * QFaces是一个自由软件，您可以自由分发、修改其中的源代码或者重新发布它，
 * 新的任何修改后的重新发布版必须同样在遵守LGPL3或更后续的版本协议下发布.
 * 关于LGPL协议的细则请参考COPYING、COPYING.LESSER文件，
 * 您可以在QFaces的相关目录中获得LGPL协议的副本，
 * 如果没有找到，请连接到 http://www.gnu.org/licenses/ 查看并获取副本。
 *
 * - Author: Huliqing
 * - Contact: huliqing.cn@gmail.com
 * - License: GNU Lesser General Public License (LGPL)
 * - Blog and source code availability: http://www.huliqing.name/
 */

package name.huliqing.qfaces.component;

import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;

import javax.servlet.http.HttpSession;
import name.huliqing.qfaces.QFaces;
import name.huliqing.qfaces.model.ValidateCode;

public class GraphValidatorManager {
	private final static Logger logger = Logger.getLogger(GraphValidatorManager.class.getName());
	
	private final static String VALIDATE_ID = 
		"name.huliqing.qfaces.validateCodes";
	
	/**
	 * 生成一个ValidateCode存放于session中
	 * @param id 主键标识,用于标识不同ValidateCode
	 * @return validateCode
	 */
	public final static ValidateCode createValidateCode(String id) {		
		HttpSession sess = QFaces.getSession();
		Map<String, ValidateCode> codeMap = (Map<String, ValidateCode>) sess.getAttribute(VALIDATE_ID);
		if (codeMap == null) {
			codeMap = new HashMap<String, ValidateCode>();
			sess.setAttribute(VALIDATE_ID, codeMap);
		}
		
		// 查看code是否已经存在于Map中,如果存在，则移除，然后产生新的code
		ValidateCode temp = codeMap.get(id);
		if (temp != null)
                    codeMap.remove(id);
		
		// 生成新的code
		ValidateCode code = new ValidateCode(getRandomCode(4));
		codeMap.put(id, code);
		return code;
	}
	
	/**
	 * 查找ValidateCode,如果没有，则返回null.
	 * @param id
	 * @return validateCode
	 */
	public final static ValidateCode findValidateCode(String id) {
		HttpSession sess = QFaces.getSession();
		Map<String, ValidateCode> codeMap = (Map<String, ValidateCode>) sess.getAttribute(VALIDATE_ID);
		return (codeMap != null ? codeMap.get(id) : null);
	}
	
	/**
	 * 验证
	 * @param id
	 * @param code
	 * @param ignoreCase 是否不区分大小写
	 * @return true/false
	 */
	public final static boolean validate(String id, String code, Boolean ignoreCase) {
		assert id != null;
		Map<String, ValidateCode> codeMap = (Map<String, ValidateCode>) QFaces.getSession()
			.getAttribute(VALIDATE_ID);
		if (codeMap == null) {
			logger.info("\"codeMap\" not found, maybe the session has expired");
			return false;
		}
		ValidateCode vCode = codeMap.get(id);
		if (vCode == null || vCode.getCode() == null)
			throw new NullPointerException("ValidateCode or Code not found!");
		
		if (ignoreCase) {
			return vCode.getCode().equalsIgnoreCase(code);
		} else {
			return vCode.getCode().equals(code);			
		}
	}
	
	private final static String getRandomCode(int total) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < total; i++) {
			sb.append((char)(65 + (int)(26 * Math.random())));
		}
		return sb.toString();
	}
	
	
}
